package simple;

/**
 * 有一幅以m x n的二维整数数组表示的图画image，其中image[i][j]表示该图画的像素值大小。
 *
 * 你也被给予三个整数 sr , sc 和 newColor 。你应该从像素image[sr][sc]开始对图像进行 上色填充 。
 *
 * 为了完成 上色工作 ，从初始像素开始，记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点，接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点，……，重复该过程。将所有有记录的像素点的颜色值改为newColor。
 *
 * 最后返回 经过上色渲染后的图像。
 *
 * 链接：https://leetcode-cn.com/problems/flood-fill
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class FloodFill {
    /**
     * 这道题目的难度 可能在于读懂题目了。
     * 一道典型的DFS题目，简单题目。
     * 还有一个难点就是 当新颜色未改变时，其实就是返回原数组。想了半天 哈哈
     * */
    class Solution {
        public int[][] floodFill(int[][] image, int sr, int sc, int newColor) {
            if(image[sr][sc] != newColor){
                recur(image,sr,sc,newColor,image[sr][sc]);
            }
            return image;
        }

        void recur(int[][] image, int sr, int sc, int newColor,int oldColor){
            if(image[sr][sc] != oldColor){
                return;
            }
            image[sr][sc] = newColor;
            if(sr < image.length-1){
                recur(image, sr+1, sc, newColor, oldColor);
            }
            if(sr > 0){
                recur(image, sr-1, sc, newColor, oldColor);
            }
            if(sc < image[0].length-1){
                recur(image, sr, sc+1, newColor, oldColor);
            }
            if(sc > 0){
                recur(image, sr, sc-1, newColor, oldColor);
            }
        }
    }
}
